import paddle
import paddle.fluid as fluid
import numpy as np
import matplotlib.pyplot as plt

# 这里注意一点：不要使用from housing import model_dir这样的方法，因为由于上面的文件没有严格按照类的写法，
# 所以调用的时候就会导致他又运行了一次训练！如果想要那样做的话，必须保证上面的文件严格按照类包的写法包裹好
# 而且这里有点不明白的地方是，我这里运行之后的结果特别好，可是在百度飞桨上运行，最后的效果很不好，不知道是为什么

model_dir = 'D:\myPaddle\model\mytrain.model'
place = fluid.CPUPlace()
infer_exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()

infer_results = []
ground_truths = []


def draw_infer_results(ground_truths, infer_results):
    title = 'Boston'
    plt.title(title, fontsize=24)
    x = np.arange(1, 20)
    y = x
    plt.plot(x,y)
    plt.xlabel('true price', fontsize=14)
    plt.ylabel('predict price', fontsize=14)
    plt.scatter(ground_truths,infer_results,color='green',label = 'train_costs')
    plt.grid()
    plt.show()

# 加载模型，进行预测
with fluid.scope_guard(inference_scope):
    [inference_program,feed_targt_names,fetch_targets]=fluid.io.load_inference_model(model_dir,infer_exe)
    infer_reader = paddle.batch(paddle.dataset.uci_housing.test(),batch_size=200)
    test_data = next(infer_reader())
    test_x = np.array([data[0] for data in test_data]).astype('float32')
    test_y = np.array([data[1] for data in test_data]).astype('float32')
    result = infer_exe.run(inference_program,{feed_targt_names[0]:test_x},fetch_targets)
    print('predict price:')
    for idx,val in enumerate(result[0]):
        print('%d: %.2f'%(idx,val))
        infer_results.append(val)
    print('ground truth')
    for idx,val in enumerate(test_y):
        print('%d: %.2f'%(idx,val))
        ground_truths.append(val)
    draw_infer_results(ground_truths,infer_results)